package tsif.tcluster;

import tsif.tcluster.service.proxy.impl.TClusterCallbacks.CallBack;

/**
 * 集群rpc访问接口
 */
public interface ITClusterAccessor {

	/** 默认阻塞访问时间 **/
	int getCallTimeOut();

	/** 设置默认阻塞访问时间 **/
	void setCallTimeOut(int callTimeOut);

	/**
	 * 集群调用服务函数(阻塞返回内容)<br>
	 * 
	 * @param service
	 *            服务Key(可以是唯一名称, 可以是指定Id)
	 * @param timeout
	 *            访问超时时间
	 **/
	<T> T call(Object service, int timeout, String funcName, Object... args);

	/** 集群调用服务函数(阻塞返回内容) **/
	<T> T call(Object service, String funcName, Object... args);

	/**
	 * 集群调用服务, 不返回不阻塞<br>
	 * 
	 * @param service
	 *            服务Key(可以是唯一名称, 可以是指定Id)
	 **/
	void send(Object service, String funcName, Object... args);

	/**
	 * 集群调用服务, 异步返回参数, 不阻塞<br>
	 * 
	 * @param service
	 *            服务Key(可以是唯一名称, 可以是指定Id)
	 **/
	<T> void send(Object service, String funcName, CallBack<T> callback, Object... args);

	/** 创建服务* **/
	long newService(Class<?> classValue, Object... args) throws Exception;

	/**
	 * 创建服务<br>
	 * 
	 * @param serviceId
	 *            服务Id(0为自动分配, 可指定)
	 * @param classValue
	 *            类(可以是名称, 也可以类对象)
	 * @param args
	 *            初始化参数
	 **/
	long newService(long serviceId, Class<?> classValue, Object... args) throws Exception;

	/** 获取集群唯一服务Id **/
	long getUniqueServiceId(Object key);

	/**
	 * 注册或获取集群唯一服务<br>
	 * 
	 * @param key
	 *            唯一服务Key
	 * @param classValue
	 *            类(可以是名称, 也可以类对象)
	 * @param args
	 *            初始化参数
	 **/
	long uniqueService(Object key, Class<?> classValue, Object... args) throws Exception;

	/**
	 * 注册或获取集群唯一服务<br>
	 * 
	 * @param newServiceId
	 *            服务Id(只有创建才生效, 如果已存在唯一服务, 这个Id无效. 0为自动分配, 可指定)
	 * @param key
	 *            唯一服务Key
	 * 
	 * @param replace
	 *            替换创建全局唯一服务
	 * @param classValue
	 *            类(可以是名称, 也可以类对象)
	 * @param args
	 *            初始化参数
	 **/
	long uniqueService(long newServiceId, Object key, boolean replace, Class<?> classValue, Object... args) throws Exception;

}
